/**
 * Copyright (C) 2012 The SkyTvOS Project
 * <p/>
 * Version     Date           Author
 * ─────────────────────────────────────
 * 2016年10月25日         yellowlgx
 */

package com.skyworth.ui.newlistview;

import android.util.SparseArray;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

import java.util.List;

public abstract class NewAdapter<T> extends BaseAdapter implements INewAdapter<T>
{

    /**
     * @Fields mDataList 泛型数据，外部控制
     */
    private List<T> mDataList;

    /**
     * @Fields mViewTypeCount item的类型总数
     */
    private int mViewTypeCount = 1;

    /**
     * @Fields mViewType 每个item的类型，会根据每一条数据进行产生
     */
    private Object mViewType;

    private ItemTypeUtil util;

    public NewAdapter(List<T> datas, int viewTypeCount)
    {
        mDataList = datas;
        mViewTypeCount = viewTypeCount;
        util = new ItemTypeUtil();
    }

    /**
     * @param data void
     * @Description 用于重新设置Adapter的数据，并对UI进行刷新<br/>
     * @date 2016-3-3
     */
    public void changeData(List<T> datas)
    {
        mDataList = datas;
        this.notifyDataSetChanged();
    }

    @Override
    public int getCount()
    {
        return mDataList != null ? mDataList.size() : 0;
    }

    @Override
    public List<T> getData()
    {
        return mDataList;
    }

    @Override
    public T getItem(int position)
    {
        return mDataList != null ? mDataList.get(position) : null;
    }

    @Override
    public long getItemId(int position)
    {
        return position;
    }

    @Override
    public Object getItemType(T t)
    {
        return -1;
    }

    /**
     * 通过数据得到obj的类型的type 然后，通过{@link ItemTypeUtil}来转换位int类型的type
     * <p/>
     * instead by{@link #getItemType(Object)}
     */
    @Override
    public int getItemViewType(int position)
    {
        if (mDataList != null && mDataList.size() > position)
            mViewType = getItemType(mDataList.get(position));
        else
            mViewType = -1;
        // 如果不写这个方法，会让listView更换dataList后无法刷新数据
        return util.getIntType(mViewType);
    }

    @Override
    public int getViewTypeCount()
    {
        return mViewTypeCount;
    }

    @SuppressWarnings("unchecked")
    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        NewAdapterItem<T> item = null;
        int viewType = getItemViewType(position);
        if (convertView == null)
        {
            item = onCreateItem(mViewType);
            convertView = item.getLayout();
            convertView.setTag(item);
        } else
        {
            item = (NewAdapterItem<T>) convertView.getTag();
            convertView = item.getLayout();
        }
        item.clearItem();
        convertView.setId(position);
        if (mDataList != null && mDataList.size() > position)
        {
            item.onUpdateItemValue(mDataList.get(position), position, viewType);
        }
        return convertView;
    }

    class ItemTypeUtil
    {
        /**
         * [int,obj]
         * <p/>
         * int : 最终的type obj : 传入的type
         */
        private SparseArray<Object> typeSArr = new SparseArray<Object>();

        /**
         * @param type item的类型
         * @return 通过object类型的type来得到int类型的type
         */
        public int getIntType(Object type)
        {
            int index = typeSArr.indexOfValue(type);
            if (index == -1)
            {
                index = typeSArr.size();
                // 如果没用这个type，就存入这个type
                typeSArr.put(index, type);
            }
            return index;
        }
    }

}
